
"""
迭代3需求 ： 用户新增功能
1. 将默认用户的数据存放在文件中 ，之前的代码用户到数据都是从该文件中查询
2. 需要对文件的读写进行异常捕获
3. 用户可以输入关键字add进行新增用户 ，新增的用户也要保存到文件中 。
4. 之前的查询和登录功能，也是正常的 。
"""

# 从文件中读取数据，返回的是列表形式数据
def from_file_get_data(file_name):
    try:
        with open(file_name,encoding='utf-8') as f:
            line = f.readline()
            user_data = eval(line)      # 将读取出的字符串转化为列表
            return user_data
    except Exception as e:
        print(e)


# 将添加的用户写入到文件中
def save_data(file_name,file_content):
    try:
        with open(file_name,mode='w',encoding='utf-8') as f:
            f.write(str(file_content))
    except Exception as e:
        print(e)

# 定义用户默认的数据
user_list = []
user_list = user_list if user_list else from_file_get_data('user_data.txt')  # 将从user_data.txt中读取



# 定义默认发返回结果
result = {'code':0,'message':''}


# 定义登录函数
def login(username,password):

    # 1. 如果用户名为空或密码为空 ，给出用户名为空或密码为空
    if username is None or username == '':
        result.update({'code':1,'message':'用户名不能为空！'})
        return result
    if password is None or password == '':
        result.update({'code':2,'message':'密码不能为空！'})
        return result
    # 2. 用户名或密码不存在 ，给出用户名或密码错误

    # 3. 用户名和密码是否匹配 。
    for user_data in user_list:
        if username == user_data.get('account') and password == user_data.get('password'):
            result.update({'code':0,'message':'登录成功','user_list':user_list})
            return result

    # 不匹配的情况，请检查您的用户名或密码是否填写正确
    result.update({'code':3,'message':'登录失败，请检查用户名或密码是否填写正确！'})
    return result

# 创建一个用户的类 ，用于进行用户操作行为，比如 ： 新增，删除，查询 ，修改

class User():

    # 添加用户
    def add_user(self,username,password='123456',**kwargs):
        user_dict = {}
        user_dict['account'] = username
        user_dict['password'] = password
        user_dict.update(**kwargs)
        user_list.append(user_dict)
        save_data('user_data.txt',user_list)
        result.update({"code":20,"message":"用户保存成功"})
        return result

    # 用户查询功能
    def get_user(self,username):

        # 1. 判断用户名是否登录 ，若登录可以运行下面的代码，若未登录，返回权限失败
        if result.get('code'):
            result.update({"code":11,"message":"用户未登录，无法查询出结果"})
            return result

        # 2. 若输入的用户名正确进行查询，并且返回结果(支持模糊查询)
        lst = []        # 存放查询到的数据
        for x in user_list:
            account = x.get('account')
            if username in account:
                x.pop('password')           # 删除键所对应的键值对
                lst.append(x)

        # 判断lst里是否有数据 ，若列表不为空 ，返回查询成功
        if lst:
            result.update({"code":10,"message":"查询用户成功","user_list":lst})
            return result

        # 若输入的用户名不正确，则返回无查询结果
        result.update({"code":12,"message":"未查询到用户，请重新输入用户名名!"})
        return result



if __name__ == '__main__':
    flag = True

    while flag:

        # 提供用户的各种操作，比如登录 ，查询 ，退出
        vls = input("请输入操作对应的编号:"
              "\n 1:) 进行登录:"
              "\n 2:) 进行用户查询，请输入用户名"
              "\n 3:) 进行用户新增，请输入用户信息"
              "\n q(uit):) 退出操作:"
              "\n 其它字符：) 未知操作，请重输入输入：")

        # 当用户输入未知符号时，进行重新输入
        if vls not in ('q','1','2','3','quit'):
            print("=" * 30)
            continue

        # 进行登录操作
        if vls == '1':
            username = input("请输入用户名:")
            password = input("请输入密码:")
            login_result = login(username, password)
            print(login_result)
            print("=" * 30)
            continue

        # 进行用户查询
        if vls == '2':
            name = input("请输入查询的用户名：")
            user = User()
            get_result = user.get_user(name)
            print(get_result)
            print("=" * 30)
            continue

        # 进行新增用户
        if vls == '3':
            name = input("请输入添加的用户名:")
            user = User()
            get_result = user.get_user(name)
            if 10 != get_result.get('code'):
                password = input("请输入用户密码:")
                role = input("请输入用户角色:")
                dept = input("请输入用户部门:")
                user.add_user(name,password,role=role,dept=dept)
            else:
                result.update({"code":21,"message":"用户已存在，无法添加"})
                print(result)

        # 进行退出操作
        if vls in ('q','quit'):
            flag = False
            print("退出成功！")
            print("=" * 30)
